home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 5 / BBS in a Box -Volume V (BBS in a Box) (April 1992).iso / Files / Prog / M / MacOberon.cpt / MacOberonToolBoxInterface.sit / SampleApp.Mod (.txt) < prev    next >
Encoding:
Oberon Text  |  1990-08-30  |  8.2 KB  |  147 lines  |  [.Ob./.Ob*]

  1. Syntax10.Scn.Fnt
  2. MODULE SampleApp;    (* Sample Macintosh Application Running under MacOberon    Michael Franz, 30.08.90 *)
  3. IMPORT
  4.     TY:= MacTypes, DL:= MacDialogs, DS:= MacDesk, EM:= MacEvents, MN:= MacMenus,
  5.     QD:= MacQuickDraw, TE:= MacTextEdit, WM:= MacWindows, Display, SYSTEM;
  6. CONST    (* Resource ID Definitions. *)
  7.     (* About Sample Alert *)    rAboutAlert= 128;
  8.     (* Sample MenuBar *)    rSampleMBar= 128;
  9.     (* Apple Menu *)    mApple= 128;    iAbout= 1;
  10.     (* File Menu *)    mFile= 129;    iQuit= 1;
  11.     (* Edit Menu *)    mEdit= 130;    iUndo= 1; iCut= 3; iCopy= 4; iPaste= 5; iClear= 6;    (* Standard Ordering. *)
  12.     (* Sample Menu *)    mSamp= 131;    iNew= 1;
  13.     inForeground: BOOLEAN;    (* Flag set if Application Currently in the Foreground [MultiFinder]. *)
  14.     winCounter: SHORTINT;    (* Application Window Number. *)
  15.     terminate: BOOLEAN;    (* Return to Oberon on next Loop Iteration when TRUE. *)
  16.     theResFile: INTEGER;    (* Reference Number of Sample's Ressource File. *)
  17. (* Switching Between the "Look And Feel" of Oberon and that of Sample. *)
  18.     PROCEDURE - OpenResFile(fileName: TY.Str255): INTEGER    0A9H, 097H;
  19.     PROCEDURE - CloseResFile(refNum: INTEGER)    0A9H, 09AH;
  20.     PROCEDURE SetupSampleLooks*;
  21.         VAR resName: TY.Str255; mb: TY.Handle;
  22.     BEGIN    TY.SetStr255("SampleApp.r", resName); theResFile:= OpenResFile(resName);
  23.         mb := MN.GetNewMBar(rSampleMBar); MN.SetMenuBar(mb);
  24.         MN.AddResMenu(MN.GetMHandle(mApple), 44525652H); (* DRVR *)
  25.         MN.AddResMenu(MN.GetMHandle(mSamp), 464F4E54H); (* FONT *)
  26.         MN.DrawMenuBar; QD.SetCursor(QD.globals.arrow); Display.Hide
  27.     END SetupSampleLooks;
  28.     PROCEDURE RestoreOberonLooks*;
  29.     BEGIN    CloseResFile(theResFile); Display.ShowStdMenus; Display.ShowStdArrow; Display.Show
  30.     END RestoreOberonLooks;
  31. (* The Sample Application. *)
  32.     PROCEDURE IsOberonWindow(window: WM.WindowPtr): BOOLEAN;    (* Check if Window belongs to Oberon Shell. *)
  33.     BEGIN    RETURN window=SYSTEM.VAL(WM.WindowPtr, Display.window)
  34.     END IsOberonWindow;
  35.     PROCEDURE IsDAWindow(window: WM.WindowPtr): BOOLEAN;    (* Check if a Window belongs to a Desk Accessory. *)
  36.     BEGIN    RETURN (window#NIL)&(window.windowKind < 0)
  37.     END IsDAWindow;
  38.     PROCEDURE IsAppWindow(window: WM.WindowPtr): BOOLEAN;    (* Check if a Window belongs to the Sample Application. *)
  39.     BEGIN    RETURN (window#NIL)&~IsOberonWindow(window)&((window.windowKind >= WM.userKind) OR (window.windowKind = WM.dialogKind))
  40.     END IsAppWindow;
  41.     PROCEDURE NewWindow*;    (* Create a New Application TextEdit Window #nn and Enable AutoScroll. *)
  42.         VAR winTitle: TY.Str255; wbounds, tbounds: TY.Rect; window: WM.WindowPtr; thePort: QD.GrafPtr; text: TE.TEHandle;
  43.     BEGIN    wbounds.top := QD.globals.screenBits.bounds.top + 40 + 10 * (winCounter MOD 10);
  44.         wbounds.left := QD.globals.screenBits.bounds.left + 20 + 10 * (winCounter MOD 10);
  45.         wbounds.bottom := wbounds.top + 200; wbounds.right := wbounds.left + 300;
  46.         INC(winCounter); winTitle[0] := 3; winTitle[1] := 23H;
  47.         winTitle[2] := (winCounter DIV 10) MOD 10 + 30H; winTitle[3] := winCounter MOD 10 + 30H;
  48.         window := WM.NewWindow(NIL, wbounds, winTitle, TRUE, 4, SYSTEM.VAL(WM.WindowPtr, -1), TRUE, 0);
  49.         QD.GetPort(thePort); QD.SetPort(window);    tbounds.left := 5; tbounds.top := 5;
  50.         tbounds.right := wbounds.right - wbounds.left - 10; tbounds.bottom := wbounds.bottom - wbounds.top - 10;
  51.         text := TE.TENew(tbounds, tbounds); text.p.txFont := 3; text.p.txSize := 12; TE.TEAutoView(TRUE, text);
  52.         window.refCon := SYSTEM.VAL(LONGINT, text); QD.SetPort(thePort)
  53.     END NewWindow; 
  54.     PROCEDURE DrawWindow(window: WM.WindowPtr);    (* Draw the Contents of the Application Window. *)
  55.     BEGIN    QD.SetPort(window); TE.TEUpdate(window.portRect, SYSTEM.VAL(TE.TEHandle, window.refCon))
  56.     END DrawWindow; 
  57.     PROCEDURE CloseWindow(window: WM.WindowPtr);    (* Close a Window. *)
  58.     BEGIN
  59.         IF    IsDAWindow(window)    THEN    DS.CloseDeskAcc(window.windowKind)    ELSE    WM.CloseWindow(window)    END
  60.     END CloseWindow;
  61.     PROCEDURE Terminate;    (* Close all Windows and Return to Oberon. *)
  62.         VAR aWindow: WM.WindowPtr;
  63.     BEGIN    terminate := TRUE; aWindow := WM.FrontWindow();    (* Currently Visible Front Window *)
  64.         WHILE    aWindow # NIL    DO    CloseWindow(aWindow); aWindow := WM.FrontWindow()    END
  65.     END Terminate;
  66.     PROCEDURE AdjustMenus;    (* Enable and Disable Menus based on the Current Processing State. *)
  67.         VAR window: WM.WindowPtr; menu: MN.MenuHandle;
  68.     BEGIN    window := WM.FrontWindow(); menu := MN.GetMHandle(mEdit);
  69.         IF    IsDAWindow(window)    THEN    (* A Desk Accessory might Need the Edit Menu. *)
  70.             MN.EnableItem(menu, iUndo); MN.EnableItem(menu, iCut); MN.EnableItem(menu, iCopy);
  71.             MN.EnableItem(menu, iPaste); MN.EnableItem(menu, iClear)
  72.         ELSE    (* But We Do Not. *)
  73.             MN.DisableItem(menu, iUndo); MN.DisableItem(menu, iCut); MN.DisableItem(menu, iCopy);
  74.             MN.DisableItem(menu, iClear); MN.DisableItem(menu, iPaste)
  75.         END
  76.     END AdjustMenus;
  77.     PROCEDURE MenuCommand(menuResult: LONGINT);    (* Item has been Chosen (by MenuSelect or MenuKey). *)
  78.         CONST noMenu= 0;
  79.         VAR menuID, menuItem: INTEGER; daName: TY.Str255; daRefNum: INTEGER; itemHit: INTEGER; handledByDA: BOOLEAN;
  80.     BEGIN    menuID := SHORT(menuResult DIV 10000H); menuItem := SHORT(menuResult MOD 10000H);
  81.         CASE    menuID    OF
  82.         |    noMenu:    (* Menu Exited during MenuSelect. *)
  83.         |    mApple:
  84.                     IF    menuItem = iAbout    THEN    itemHit := DL.Alert(rAboutAlert, NIL)
  85.                     ELSE    MN.GetItem(MN.GetMHandle(mApple), menuItem, daName); daRefNum := DS.OpenDeskAcc(daName)
  86.                     END
  87.         |    mFile:    IF    menuItem = iQuit    THEN    Terminate    END
  88.         |    mEdit:    IF    IsDAWindow(WM.FrontWindow())    THEN    handledByDA := DS.SystemEdit(menuItem-1)    END
  89.         |    mSamp:    IF    menuItem = iNew    THEN    NewWindow    END
  90.         END;
  91.         MN.HiliteMenu(noMenu)    (* Unhighlight what MenuSelect (or MenuKey) Highlighted. *)
  92.     END MenuCommand;
  93.     PROCEDURE Update(window: WM.WindowPtr);    (* This is Called when an Update Event is Received. *)
  94.     BEGIN
  95.         IF    IsAppWindow(window)    THEN    WM.BeginUpdate(window);
  96.             IF    ~QD.EmptyRgn(window.visRgn)    THEN
  97.                 TE.TEUpdate(window.portRect, SYSTEM.VAL(TE.TEHandle, window.refCon))
  98.             END;
  99.             WM.EndUpdate(window)
  100.         END
  101.     END Update;
  102.     PROCEDURE Activate(window: WM.WindowPtr; becomingActive: BOOLEAN);    (* Window is Activated or Deactivated. *)
  103.     BEGIN
  104.         IF    IsAppWindow(window)    THEN
  105.             IF    becomingActive    THEN    QD.SetPort(window); TE.TEActivate(SYSTEM.VAL(TE.TEHandle, window.refCon))
  106.             ELSE    TE.TEDeactivate(SYSTEM.VAL(TE.TEHandle, window.refCon))    END
  107.         END
  108.     END Activate;
  109.     PROCEDURE Loop*();
  110.         VAR gotEvent: BOOLEAN; event: EM.EventRecord; window: WM.WindowPtr; key: TY.UnpackedChar;
  111.     BEGIN    SetupSampleLooks; terminate := FALSE;
  112.         REPEAT    gotEvent := EM.WaitNextEvent(EM.everyEvent, event, 0, NIL);
  113.             CASE    event.what    OF
  114.             |    EM.mouseDown:
  115.                         CASE WM.FindWindow(event.where, window) OF
  116.                         |    WM.inMenuBar:    AdjustMenus; MenuCommand(MN.MenuSelect(event.where))
  117.                         |    WM.inSysWindow:    DS.SystemClick(event, window)
  118.                         |    WM.inContent:
  119.                                     IF    window # WM.FrontWindow()    THEN    WM.SelectWindow(window)
  120.                                     ELSE    QD.GlobalToLocal(event.where);
  121.                                         TE.TEClick(event.where, FALSE, SYSTEM.VAL(TE.TEHandle, window.refCon))
  122.                                     END
  123.                         |    WM.inDrag:    WM.DragWindow(window, event.where, QD.globals.screenBits.bounds)
  124.                         |    WM.inGoAway:    CloseWindow(window)
  125.                         |    WM.inDesk, WM.inGrow, WM.inZoomIn, WM.inZoomOut:
  126.                         END;
  127.             |    EM.keyDown:    (* message: bits 0..7=character code / modifiers: bit8: 0=cmdKeyUp 1=cmdKeyDown *)
  128.                         key := SHORT(event.message MOD 100H);
  129.                         IF    8 IN SYSTEM.VAL(SET, LONG(event.modifiers))    THEN    AdjustMenus; MenuCommand(MN.MenuKey(key))
  130.                         ELSE    window := WM.FrontWindow(); TE.TEKey(key, SYSTEM.VAL(TE.TEHandle, window.refCon))    END
  131.             |    EM.autoKey:    
  132.                         key := SHORT(event.message MOD 100H);    (* bits 0..7=character code *)
  133.                         window := WM.FrontWindow(); TE.TEKey(key, SYSTEM.VAL(TE.TEHandle, window.refCon))
  134.             |    EM.updateEvt:    Update(SYSTEM.VAL(WM.WindowPtr, event.message))
  135.             |    EM.activateEvt:    Activate(SYSTEM.VAL(WM.WindowPtr, event.message), ODD(event.modifiers))    (* bit0:  0=deactivate 1=activate *)
  136.             |    EM.app4Evt:    (* OS Event under MultiFinder; bit31..bit24=00000001: SuspendResumeEvt *)
  137.                         IF    SYSTEM.LSH(event.message, -24) (*MOD 100H*) = 1    THEN    (* bit0:  0=deactivate 1=activate *)
  138.                             inForeground := ODD(event.message); Activate(WM.FrontWindow(), inForeground);
  139.                         END
  140.             ELSE    (* Ignore Other Event Types *)
  141.             END    (* Dispatch on Event Type *)
  142.         UNTIL    terminate;
  143.         RestoreOberonLooks
  144.     END Loop;
  145. BEGIN    inForeground := TRUE
  146. END SampleApp.
  147.